#include "queue.h"


/**
***********************************************************************
* @brief   初始化队列
* @param   Queue *queue, size_t capacity
* @retval  
* @note  
***********************************************************************
*/
void initQueue(Queue *queue, size_t capacity)
{
	queue->data = (int *)malloc(sizeof(int) * capacity);//队列内存空间申请
	/*判断内存空间是否申请成功*/
	if(queue->data == NULL)
	{
		printf("队列内存申请失败\n");
		return;
	}
	printf("队列内存空间申请成功\n");
	queue->capacity = capacity;
	queue->length = 0;
	queue->front = 0;
	queue->rear = 0;
	printf("队列初始化成功\n");
}

/**
***********************************************************************
* @brief   返回队列内元素个数
* @param   const Queue *queue
* @retval  队列元素长度
* @note  
***********************************************************************
*/
size_t getSize(const Queue *queue)
{
	return queue->length;
}

/**
***********************************************************************
* @brief   元素入队列
* @param   Queue *queue, int element
* @retval  
* @note  
***********************************************************************
*/
void enqueue(Queue *queue, int element)
{
	/*判断队列是否已满*/
	if(queue->length == queue->capacity)
	{
		printf("队列已满，入队失败\n");
		return;
	}
	queue->data[queue->rear] = element;//元素入队列
	queue->length ++;//队列数据长度递增
	queue->rear = (queue->rear + 1) % queue->capacity;//使得rear的值在0-capacity-1内循环
}

/**
***********************************************************************
* @brief   元素出队列
* @param   Queue *queue
* @retval  返回出队列的元素
* @note  
***********************************************************************
*/
int dequeue(Queue *queue)
{
	/*判断队列是否为空*/
	if(queue->length == 0)
	{
		printf("队列为空，出队失败\n");
		return -1;
	}
	int delete_queue_data = queue->data[queue->front];//将需要出队列的数据存放在delete_queue_data
	queue->length --;//队列数据长度递减
	queue->front = (queue->front + 1) % queue->capacity;

	return delete_queue_data;//返回出队列的数据
}

/**
***********************************************************************
* @brief   释放队列内存
* @param   Queue *queue
* @retval  无
* @note  
***********************************************************************
*/
void destroyQueue(Queue *queue)
{
	/*判断队列是否为空*/
	if(queue->data == NULL)
	{
		printf("队列内存为空，没有可以释放队列内存\n");
		return;
	}
	printf("队列内存不为空，队列内存可以被操作释放\n");
	free(queue->data);//释放队列内存

	queue->data = NULL;//将队列指针设置为空，避免出现野指针
	queue->capacity = 0;
	queue->length = 0;
	queue->rear = 0;
	queue->front = 0;
}

/**
***********************************************************************
* @brief   遍历队列
* @param   Queue *queue
* @retval  
* @note  
***********************************************************************
*/
void printQueue(Queue *queue)
{
	// int j = queue->front;
	// for(int i = 0; i < queue->length; i++)
	// {
	// 	printf("%d ", queue->data[j]);
	// 	j = (j + 1) % queue->capacity;
	// }
	for(int i = queue->front, j = 0; j < queue->length; i++, j++)
	{
		printf("%d", queue->data[i % queue->capacity]);
	}
	printf("\n");
} 